home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / dskut / iaca101.zip / ENVUTIL.C next >
C/C++ Source or Header  |  1990-03-21  |  4KB  |  259 lines

  1.  
  2. /*    ENVUTIL.C    */
  3.  
  4. /*
  5.     Written by OPENetwork 1988.
  6.     Donated by OPENetwork to the public domain.
  7.     Author: John Lowenthal (BIX: jlowenthal)
  8. */
  9.  
  10. /*
  11.     Utilities for manipulating the Master (Command-level)
  12.     Environment (or any other copy of the environment you want).
  13.  
  14.     Compiled with: Turbo C, Large Model
  15.     Will compile with MSC 5.x with no changes except for perhaps
  16.     the #include's of compiler-supplied headers.
  17.     
  18. */
  19.  
  20. #include    <stdlib.h> 
  21. #include    <string.h>
  22. #include    <process.h>
  23. #include    <dos.h>
  24. #include    <stddef.h>
  25. #include    "envutil.h"
  26.  
  27. /*
  28.     In all of the following, the "seg" parameter is the segment
  29.     of the environment data, not the segment of the allocated-block
  30.     header that precedes it.
  31. */
  32.  
  33. /*
  34.     Function: envavail()
  35.     
  36.     Get amount of available space in the environment.
  37.     
  38.     int envavail(unsigned seg);
  39.     
  40. */
  41.  
  42. int envavail(unsigned seg)
  43.  
  44. {
  45.  
  46. char *datbase = MK_FP(seg,0);
  47. char *lenptr;
  48. int  totlen;
  49. int  used;
  50. int  entlen;
  51. char *datscan;
  52. unsigned hdrseg;
  53.  
  54.     for (datscan = datbase, used = 1;
  55.          *datscan;
  56.          datscan += entlen, used += entlen)
  57.     {
  58.         entlen = strlen(datscan) + 1;
  59.     }
  60.     hdrseg = seg - 1;
  61.     lenptr = MK_FP(hdrseg,3);
  62.     totlen = *((int *)lenptr) << 4;
  63.     return(totlen - used);
  64.     
  65. }
  66.  
  67. /*
  68.     Function: envempty()
  69.     
  70.     Get address of empty space in the environment (null string ptr).
  71.     
  72.     char *envempty(unsigned seg);
  73.     
  74. */
  75.  
  76. char *envempty(unsigned seg)
  77.  
  78. {
  79.  
  80. char *datbase = MK_FP(seg,0);
  81. int  entlen;
  82. char *datscan;
  83.  
  84.     for (datscan = datbase;
  85.          *datscan;
  86.          datscan += entlen)
  87.     {
  88.         entlen = strlen(datscan) + 1;
  89.     }
  90.     return(datscan);
  91.     
  92. }
  93.  
  94. /*
  95.     Function: envrmsz()
  96.                  
  97.     Get the length of environment data from a given point to the
  98.     end of the environment.
  99.     
  100.     int envrmsz(char *the_point);
  101.     
  102. */
  103.  
  104. int envrmsz(char *the_point)
  105.  
  106. {
  107.  
  108. char *cp;
  109. int len;
  110. int entlen;
  111.  
  112.     for (cp = the_point, len = 1; *cp; cp += entlen, len += entlen)
  113.         entlen = strlen(cp) + 1;
  114.     return(len);
  115.     
  116. }
  117.  
  118. /*
  119.     Function: enventf()
  120.     
  121.     Find an entry in the environment.
  122.     
  123.     char *enventf(unsigned seg, char *varname);
  124.     
  125.     Returns NULL if not found.
  126.     
  127. */
  128.  
  129. char *enventf(unsigned seg, char *varname)
  130.  
  131. {
  132.  
  133. char *datbase = MK_FP(seg,0);
  134. char *cp;
  135. int entlen;
  136. char curent[160];
  137. char *eqptr;
  138.  
  139.     for (cp = datbase; *cp; cp += entlen)
  140.     {
  141.         if ((entlen = strlen(cp) + 1) > 160)
  142.             return(NULL);
  143.         memcpy(curent,cp,entlen);
  144.         if (! (eqptr = memchr(curent,'=',entlen)))
  145.             return(NULL);
  146.         *eqptr = 0;
  147.         if (! stricmp(curent,varname))
  148.             return(cp);
  149.     }
  150.     return(NULL);
  151.     
  152. }
  153.  
  154. /*
  155.     Function: envvalf()
  156.     
  157.     Find the value of an entry in the environment.
  158.     
  159.     char *envvalf(unsigned seg, char *varname);
  160.     
  161.     Returns NULL if not found.
  162.     
  163. */
  164.  
  165. char *envvalf(unsigned seg, char *varname)
  166.  
  167. {
  168.  
  169. char *entaddr;
  170. char *eqptr;
  171.  
  172.     if (! (entaddr = enventf(seg,varname)))
  173.         return(NULL);
  174.         
  175.     if (! (eqptr = strchr(entaddr,'=')))
  176.         return(NULL);
  177.         
  178.     return(eqptr + 1);
  179.     
  180. }
  181.  
  182. /*
  183.     Function: envdel()
  184.     
  185.     Delete an entry from the environment.
  186.     
  187.     int envdel(unsigned seg, char *varname);
  188.     
  189.     Returns: 1 = Success, 0 = not found.
  190.     
  191. */
  192.  
  193. int envdel(unsigned seg, char *varname)
  194.  
  195. {
  196.  
  197. char *entaddr;
  198. char *nextaddr;
  199. int entlen;
  200. int remlen;
  201.  
  202.  
  203.     if (! (entaddr = enventf(seg,varname)))
  204.         return(0);
  205.         
  206.     entlen = strlen(entaddr) + 1;
  207.     nextaddr = entaddr + entlen;
  208.     remlen = envrmsz(nextaddr);
  209.     memmove(entaddr,nextaddr,remlen);
  210.     nextaddr = envempty(seg);
  211.     remlen = envavail(seg) + 1;
  212.     memset(nextaddr,0,remlen);
  213.     
  214.     return(1);
  215.     
  216. }
  217.  
  218. /*
  219.     Function: envadd()
  220.     
  221.     Add an entry to the environment, or change an existing entry.
  222.     
  223.     int envadd(unsigned seg, char *entry);
  224.     
  225.     Returns: 1 = OK, 0 = failure.
  226.     
  227. */
  228.  
  229. int envadd(unsigned seg, char *entry)
  230.  
  231. {
  232.  
  233. char varname[50];
  234. int varlen;
  235. int entlen;
  236. char *addpoint;
  237. int avail;
  238. char *eqptr;
  239.  
  240.     if (! (eqptr = strchr(entry,'=')))
  241.         return(0);
  242.     if (! (varlen = eqptr - entry))
  243.         return(0);
  244.     memcpy(varname,entry,varlen);
  245.     varname[varlen] = 0;
  246.     envdel(seg,varname);
  247.     if (! *(eqptr + 1))
  248.         return(1);
  249.     entlen = strlen(entry) + 1;
  250.     avail = envavail(seg);
  251.     if (entlen + 1 > avail)
  252.         return(0);
  253.     addpoint = envempty(seg);
  254.     memcpy(addpoint,entry,entlen);
  255.     addpoint[entlen] = 0;
  256.     return(1);
  257.     
  258. }
  259.